package com.bauer.base.jvm.gc;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author ：rui.wei
 * @Date ：Created in 10:44 2019/6/5
 * @Description：
 */
public class GCAlgorithm {


    /**
     * 实际会发生GC
     * GCroots 有四种
     * 1、虚拟机栈上引用的对象
     * 2、静态属性应用的对象
     * 3、常量池中应用的对象
     * 4、JNI引用的对象
     * @param args
     */
    public static void main(String[] args) {
        ObjectHolder objectHolderA = new ObjectHolder();
        ObjectHolder objectHolderB = new ObjectHolder();
        objectHolderA.object = objectHolderB;
        objectHolderB.object = objectHolderA;
        objectHolderA = null;
        objectHolderB = null;
        System.gc();
    }

    /**
     * 强引用  指的是new 这一类的直接引用
     * 只要引用存在时不会被垃圾收集器回收的
     */
    public static void strongReference(){
        Object object = new Object();
    }

    /**
     * 软引用是 使用SoftReference 来穿件相应的对象
     * 有用但非必须的    当内存不足发生溢出之前  gc时会回收软引用的对象
     * 利用软引用可以用作缓存
     */
    public static void softReference(){
        SoftReference<List<String>> listSoftReference =  new SoftReference<>(new ArrayList<>());
    }

    /**
     * 弱引用  使用WeakReference来创建对象
     * 非必须的   弱引用的对象只能存活到下次gc
     */
    public static void weekReference(){
        WeakReference<String> weakReference =  new WeakReference<>("12");
    }

    /**
     * 虚引用  用PhantomReference来创建对象
     * 最弱的引用 无法通过这个获取到对象的引用   虚引用唯一的目的就是在垃圾回收时收到一个通知
     */
    public static void phantomReference(){
        PhantomReference<String> phantomReference =  new PhantomReference<>("",new ReferenceQueue<>());
    }
}
